﻿using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
namespace GameVLTK
{
    public class MovingPlaneMotionModule : PlaneMotionModule
    {
        protected bool _bPlay;

        //Hướng di chuyển
        private int _direct;
        private int _directOld;

        private double _fTimeOld;

        //Đối tượng sẽ di chuyển
        private MoveableUnit _MoveableUnit;

        //Khoảng cách cần di chuyển
        private double _lenMoving;

        public MovingPlaneMotionModule(float vx, float vy, double fLen, MoveableUnit moveableUnit, 
            int iDirect): base(vx, vy)
        {
            //Quãng đường mà đối tượng sẽ di chuyển
            this._lenMoving = fLen;

            //Đối tượng cần di chuyển
            this._MoveableUnit = moveableUnit;

            //Hướng cũ của đối tượng
            this._directOld = moveableUnit.CurrentDirection;

            //Hướng sẽ di chuyển
            this._direct = iDirect;
        }

        public override void OnMotion(Player character, GameTime gameTime)
        {
            //Trường hợp nhân vật không có di chuyển hoặc khoảng cách di chuyển <= 0
            if (!this._bPlay || (this._lenMoving <= 0.0))
            {
                /*if (this._bPlay && (this._directOld != this._Char.Direction))
                {
                    this._Char.Direction = this._directOld;
                }*/

                this._bPlay = false;

                //Tính toán lại dãy frame và size cho nhân vật
                this._MoveableUnit.PrevState = this._MoveableUnit.PrevState;
                this._MoveableUnit.CurrentState = (int)Global.enmStates.DUNG_YEN;
            }
            else
            {
                if (this._fTimeOld > 0.0)
                {
                    //Tính độ dài cho mỗi lần dịch chuyển
                    Vector2 l = new Vector2((float) (base.Vx * (gameTime.TotalGameTime.TotalSeconds - this._fTimeOld)), 
                        (float) (base.Vy * (gameTime.TotalGameTime.TotalSeconds - this._fTimeOld)));

                    //Cập nhật lại quãng đường đã di chuyển được
                    this._lenMoving -= l.Length();

                    
                    //Di chuyển đối tượng
                    Vector2 distance = this._MoveableUnit.TopLeft;
                    distance.X += l.X;
                    distance.Y += l.Y;
                    this._MoveableUnit.TopLeft = distance;



                }

                //Trường hợp hướng cần di chuyển là hướng # so với hướng hiện tại thì
                //cập nhật lại
               /* if (this._direct != character.PrevDirection)
                {
                    this._Char.Direction = this._direct;
                }*/

                this._fTimeOld = gameTime.TotalGameTime.TotalSeconds;
            }
        }

        public override void Pause()
        {
            this._bPlay = false;
            this._fTimeOld = 0.0;
        }

        public override void Play()
        {
            this._bPlay = true;
            this._fTimeOld = 0.0;
        }

        public override void Play(float fLen)
        {
            this._bPlay = true;
            this._lenMoving = fLen;
            this._fTimeOld = 0.0;
        }

        public override void Stop()
        {
            base.Stop();
            this._bPlay = false;
            this._lenMoving = 0.0;
            //this._Char.Direction = this._directOld;
        }

        public int Direct
        {
            get
            {
                return this._direct;
            }
            set
            {
                this._direct = value;
            }
        }

        public override bool IsMoving
        {
            get
            {
                return this._bPlay;
            }
        }

        public double LenMoving
        {
            get
            {
                return this._lenMoving;
            }
            set
            {
                this._lenMoving = value;
            }
        }
    }
}

